iT邦幫忙

2022 iThome 鐵人賽

DAY 15
0
自我挑戰組

從前端角度看30天學Python系列 第 15

【Day 15】Python中的型別錯誤

  • 分享至 

  • xImage
  •  
  • SyntaxError
  • NameError
  • IndexError
  • ModuleNotFoundError
  • AttributeError
  • KeyError
  • TypeError
  • ImportError
  • ValueError
  • ZeroDivisionError

這篇文章是閱讀Asabeneh的30 Days Of Python: Day 15 - Python Type Errors後的學習筆記與心得。


跟JavaScript(以下簡稱JS)一樣,像是打錯字(typo)或是一些常見的錯誤,Python的直譯器(interpreter)跑到該段落時就會顯示錯誤訊息;了解錯誤訊息的型別能幫助辨識出錯的原因,讓除錯更順利。

SyntaxError

出現在語法錯誤的時候,下方的print函式忘了加括號:

print "hello world"
# SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
  • 可以看到訊息中有提示我們想的是不是print(...)

NameError

出現在使用了未定義的變數名稱的時候:

happy("python")
# NameError: name 'happy' is not defined

修復的方式就是定義happy這個名稱:

def happy(string):
	print(string.upper())

IndexError

當嘗試索引的值超過串列(list)實際有的項目個數時產生:

numbers = [1, 2, 3, 4, 5]
# list index starts from 0
numbers[5]
# IndexError: list index out of range

ModuleNotFoundError

當嘗試引入不存在的模組時產生:

import maths
# ModuleNotFoundError: No module named 'maths'
  • 實際上Python內建的數學模組名稱是math,不是複數型

AttributeError

當嘗試訪問物件中不存在的屬性時產生,這邊實際上math模組中有的是pi(大小寫有差):

import math
math.PI
# AttributeError: module 'math' has no attribute 'PI'. Did you mean: 'pi'?
  • 可以看到訊息中有提示我們想的是不是math.pi

KeyError

當嘗試訪問字典(dictionary)中不存在的鍵(key)時會產生:

greek_alphabet = {"A": "alpha", "B": "beta", "K": "kappa"}
greek_alphabet["C"]
# KeyError: 'C'

TypeError

型別錯誤,發生在使用錯誤的型別進行操作時:

print(123 + "456")
# TypeError: unsupported operand type(s) for +: 'int' and 'str'
  • 錯誤訊息提到一個是int型別另一個是str型別,不能相加。
  • 這個操作在JS中會有隱式型別轉換,變成"123" + "456",印出字串 - 123456

修正的方法可以是把其中一方轉換成另一方的型別:

print(str(123) + "456") # '123456'
print(123 + int(456)) # 579

ImportError

發生在嘗試從模組中引入不存在的物件時:

from math import power
# ImportError: cannot import name 'power' from 'math' (unknown location)
  • 正確是pow

ValueError

當操作或給函式參數的值是正確型別,但內容有問題,且此情況不能用更精確的錯誤類型描述,如IndexError

print(int("12a"))
# ValueError: invalid literal for int() with base 10: '12a'
  • 可以看到錯誤說明在10進位下給int()的參數值不對,若多給一個參數改成16進位就會成功:int("12a", base=16),輸出298

ZeroDivisionError

用任意數除以0就會產生這個錯誤:

print(1/0)
# ZeroDivisionError: division by zero

上一篇
【Day 14】高階函式
下一篇
【Day 16】日期與時間
系列文
從前端角度看30天學Python30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言